home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 051-075 / disk_064 / include / iff / smus.h < prev   
C/C++ Source or Header  |  1992-05-06  |  8KB  |  185 lines

  1. /*----------------------------------------------------------------------*
  2.  * SMUS.H  Definitions for Simple MUSical score.   2/12/86
  3.  *
  4.  * By Jerry Morrison and Steve Hayes, Electronic Arts.
  5.  * This software is in the public domain.
  6.  *
  7.  * This version for the Commodore-Amiga computer.
  8.  *----------------------------------------------------------------------*/
  9. #ifndef SMUS_H 
  10. #define SMUS_H
  11.  
  12. #ifndef COMPILER_H
  13. #include "iff/compiler.h"
  14. #endif
  15.  
  16. #include "iff/iff.h"
  17.  
  18. #define ID_SMUS      MakeID('S', 'M', 'U', 'S')
  19. #define ID_SHDR      MakeID('S', 'H', 'D', 'R')
  20. #define ID_NAME      MakeID('N', 'A', 'M', 'E')
  21. #define ID_Copyright MakeID('(', 'c', ')', ' ')
  22. #define ID_AUTH      MakeID('A', 'U', 'T', 'H')
  23. #define ID_ANNO      MakeID('A', 'N', 'N', 'O')
  24.  
  25. #define ID_INS1      MakeID('I', 'N', 'S', '1')
  26. #define ID_TRAK      MakeID('T', 'R', 'A', 'K')
  27.  
  28. /* ---------- SScoreHeader ---------------------------------------------*/
  29. typedef struct {
  30.     UWORD tempo;    /* tempo, 128ths quarter note/minute */
  31.     UBYTE volume;    /* playback volume 0 through 127 */
  32.     UBYTE ctTrack;    /* count of tracks in the score */
  33.     } SScoreHeader;
  34.  
  35. /* ---------- NAME -----------------------------------------------------*/
  36. /* NAME chunk contains a CHAR[], the musical score's name. */
  37.  
  38. /* ---------- Copyright (c) --------------------------------------------*/
  39. /* "(c) " chunk contains a CHAR[], the FORM's copyright notice. */
  40.  
  41. /* ---------- AUTH -----------------------------------------------------*/
  42. /* AUTH chunk contains a CHAR[], the name of the score's author. */
  43.  
  44. /* ---------- ANNO -----------------------------------------------------*/
  45. /* ANNO chunk contains a CHAR[], the author's text annotations. */
  46.  
  47. /* ---------- INS1 -----------------------------------------------------*/
  48. /* Constants for the RefInstrument's "type" field. */
  49. #define INS1_Name  0    /* just use the name; ignore data1, data2 */
  50. #define INS1_MIDI  1    /* <data1, data2> = MIDI <channel, preset> */
  51.  
  52. typedef struct {
  53.     UBYTE iRegister;    /* set this instrument register number */
  54.     UBYTE type;        /* instrument reference type (see above) */
  55.     UBYTE data1, data2;    /* depends on the "type" field */
  56.     char name[60];    /* instrument name */
  57.     } RefInstrument;
  58.  
  59. /* ---------- TRAK -----------------------------------------------------*/
  60. /* TRAK chunk contains an SEvent[]. */
  61.  
  62. /* SEvent: Simple musical event. */
  63. typedef struct {
  64.     UBYTE sID;        /* SEvent type code */
  65.     UBYTE data;        /* sID-dependent data */
  66.     } SEvent;
  67.  
  68. /* SEvent type codes "sID". */
  69. #define SID_FirstNote     0
  70. #define SID_LastNote    127    /* sIDs in the range SID_FirstNote through
  71.                  * SID_LastNote (sign bit = 0) are notes. The
  72.                  * sID is the MIDI tone number (pitch). */
  73. #define SID_Rest        128    /* a rest; same data format as a note. */
  74.  
  75. #define SID_Instrument  129    /* set instrument number for this track. */
  76. #define SID_TimeSig     130    /* set time signature for this track. */
  77. #define SID_KeySig    131    /* set key signature for this track. */
  78. #define SID_Dynamic    132    /* set volume for this track. */
  79. #define SID_MIDI_Chnl    133    /* set MIDI channel number (sequencers) */
  80. #define SID_MIDI_Preset    134    /* set MIDI preset number (sequencers) */
  81. #define SID_Clef        135     /* inline clef change. 
  82.                                  * 0=Treble, 1=Bass, 2=Alto, 3=Tenor. */
  83. #define SID_Tempo       136     /* Inline tempo change in beats per minute.*/
  84.  
  85. /* SID values 144 through 159: reserved for Instant Music SEvents. */
  86.  
  87. /* The remaining sID values up through 254: reserved for future
  88.  * standardization. */
  89. #define SID_Mark        255    /* SID reserved for an end-mark in RAM. */
  90.  
  91. /* ---------- SEvent FirstNote..LastNote or Rest -----------------------*/
  92. typedef struct {
  93.     unsigned tone     :8,    /* MIDI tone number 0 to 127; 128 = rest */
  94.              chord    :1,    /* 1 = a chorded note */
  95.              tieOut   :1,    /* 1 = tied to the next note or chord */
  96.              nTuplet  :2,    /* 0 = none, 1 = triplet, 2 = quintuplet,
  97.                  * 3 = septuplet */
  98.              dot      :1,    /* dotted note; multiply duration by 3/2 */
  99.              division :3;    /* basic note duration is 2**-division:
  100.                  * 0 = whole note, 1 = half note, 2 = quarter
  101.                  * note, ... 7 = 128th note */
  102.     } SNote;
  103.  
  104. /* Warning: An SNote is supposed to be a 16-bit entity.
  105.  * Some C compilers will not pack bit fields into anything smaller
  106.  * than an int. So avoid the actual use of this type unless you are certain
  107.  * that the compiler packs it into a 16-bit word.
  108.  */
  109.  
  110. /* You may get better object code by masking, ORing, and shifting using the
  111.  * following definitions rather than the bit-packed fields, above. */
  112. #define noteChord  (1<<7)    /* note is chorded to next note */
  113.  
  114. #define noteTieOut (1<<6)    /* note/chord is tied to next note/chord */
  115.  
  116. #define noteNShift 4            /* shift count for nTuplet field */
  117. #define noteN3     (1<<noteNShift)    /* note is a triplet */
  118. #define noteN5     (2<<noteNShift)    /* note is a quintuplet */
  119. #define noteN7     (3<<noteNShift)    /* note is a septuplet */
  120. #define noteNMask  noteN7        /* bit mask for the nTuplet field */
  121.  
  122. #define noteDot    (1<<3)        /* note is dotted */
  123.  
  124. #define noteDShift 0            /* shift count for division field */
  125. #define noteD1     (0<<noteDShift)    /* whole note division */
  126. #define noteD2     (1<<noteDShift)    /* half note division */
  127. #define noteD4     (2<<noteDShift)    /* quarter note division */
  128. #define noteD8     (3<<noteDShift)     /* eighth note division */
  129. #define noteD16    (4<<noteDShift)     /* sixteenth note division */
  130. #define noteD32    (5<<noteDShift)     /* thirty-secondth note division */
  131. #define noteD64    (6<<noteDShift)     /* sixty-fourth note division */
  132. #define noteD128   (7<<noteDShift)     /* 1/128 note division */
  133. #define noteDMask  noteD128        /* bit mask for the division field */
  134.  
  135. #define noteDurMask 0x3F        /* bit mask for all duration fields
  136.                      * division, nTuplet, dot */
  137.  
  138. /* Field access: */
  139. #define IsChord(snote)    (((UWORD)snote) & noteChord)
  140. #define IsTied(snote)     (((UWORD)snote) & noteTieOut)
  141. #define NTuplet(snote)     ((((UWORD)snote) & noteNMask) >> noteNShift)
  142. #define IsDot(snote)     (((UWORD)snote) & noteDot)
  143. #define Division(snote) ((((UWORD)snote) & noteDMask) >> noteDShift)
  144.  
  145. /* ---------- TimeSig SEvent -------------------------------------------*/
  146. typedef struct {
  147.     unsigned type     :8,    /* = SID_TimeSig */
  148.              timeNSig :5,    /* time signature "numerator" timeNSig + 1 */
  149.              timeDSig :3;    /* time signature "denominator" is
  150.                  * 2**timeDSig: 0 = whole note, 1 = half
  151.                  * note, 2 = quarter note, ...
  152.                  * 7 = 128th note */
  153.     } STimeSig;
  154.  
  155. #define timeNMask  0xF8        /* bit mask for timeNSig field */
  156. #define timeNShift 3        /* shift count for timeNSig field */
  157.  
  158. #define timeDMask  0x07        /* bit mask for timeDSig field */
  159.  
  160. /* Field access: */
  161. #define TimeNSig(sTime)  ((((UWORD)sTime) & timeNMask) >> timeNShift)
  162. #define TimeDSig(sTime)   (((UWORD)sTime) & timeDMask)
  163.  
  164. /* ---------- KeySig SEvent --------------------------------------------*/
  165. /* "data" value 0 = Cmaj; 1 through 7 = G,D,A,E,B,F#,C#;
  166.  * 8 through 14 = F,Bb,Eb,Ab,Db,Gb,Cb.                    */
  167.  
  168. /* ---------- Dynamic SEvent -------------------------------------------*/
  169. /* "data" value is a MIDI key velocity 0..127. */
  170.  
  171.  
  172. /* ---------- SMUS Reader Support Routines -----------------------------*/
  173.  
  174. /* Just call this to read a SHDR chunk. */
  175. #define GetSHDR(context, ssHdr)  \
  176.     IFFReadBytes(context, (BYTE *)ssHdr, sizeof(SScoreHeader))
  177.  
  178. /* ---------- SMUS Writer Support Routines -----------------------------*/
  179.  
  180. /* Just call this to write a SHDR chunk. */
  181. #define PutSHDR(context, ssHdr)  \
  182.     PutCk(context, ID_SHDR, sizeof(SScoreHeader), (BYTE *)ssHdr)
  183.  
  184. #endif
  185.